package interfaz;

import Main.Principal;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.util.ArrayList;


/*
 * Escenario.java
 *
 * Created on 26 de febrero de 2008, 23:32
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
/**
 *
 * @author victor
 */

/* Escenario de iWidgets (menus, fotos, etc.) para formar un escenario */
public class Escenario {

    //Indicamos o tamanho de pantalla
    private static int winWIDTH = 1280;
    private static int winHEIGHT = 800;
    
    private ArrayList items = new ArrayList();  //Widgets almacenados
    private ArrayList itemsListening = new ArrayList(); //Widgets escoitando eventos
    private String nextEsc = ""; //Escenario posterior (menu posterior)
    private String prevEsc = ""; //Escenario anterior (menu anterior)
    private int menuItem; //Indice onde se atopa o menu
    private int mainPicture = -1;
    private int progressBar = -1;
    private String id = ""; //Identificador do escenario
    private int alphaEffect = 255;
    private boolean fadeInEffect = true;
    private iPicture background;
    private int bgOpacity = 100;
    
    /**
     * Creates a new instance of Escenario
     */
    public Escenario() {
        background = new iPicture(0, 0);
        background.setWidth(winWIDTH);
        background.setHeight(winHEIGHT);
    }

    public void setMainPicture(int index) {
        this.mainPicture = index;
    }
    
    private int getMainPicture() {
        return this.mainPicture;  
    }

    public void setProgressBar(int index) {
        this.progressBar = index;
    }
    
    public int getProgressBar() {
        return this.progressBar;  
    }
    
    public static void setWidth (int width) {
        winWIDTH = width;
    }
    public static int getWidth() {
        return winWIDTH;
    }
    
    public static void setHeight (int height) {
        winHEIGHT = height;
    }
    public static int getHeight() {
        return winHEIGHT;
    }
    
    public void setBackground(String path) {
        background.setImage(path);
        background.loadBuffer();
    }

    public void setBgOpacity(int op) {
        bgOpacity = op;
    }

    public int getBgOpacity() {
        return bgOpacity;
    }

    public int addItem(iWidget widget) {
        items.add(widget);
        return items.indexOf(widget); //Interesa saber onde se almacena
    }

    public iWidget getItem(int pos) {
        return (iWidget) items.get(pos);
    }
    
    public void delItem(int pos) {
        items.remove(pos);
    }

    public void setId(String title) {
        this.id = title;
    }

    public String getId() {
        return this.id;
    }

    public void setTitle(String title) {
        iText tit = new iText(530, 100); //Ponhemos un titulo
        tit.setFont(new Font("Verdana", 0, 72));
        tit.setMaxChars(18);
        tit.setWidth(300);
        tit.setHeight(120);
        tit.setColor(Color.WHITE);
        tit.setText(title);
        this.addItem(tit);
        
        iLine line = new iLine(530,120);
        line.setWidth(1000);
        line.setHeight(5);
        this.addItem(line);
    }

    public void addListening(int pos) { /*Activa ao elemento en pos a escoitar
         *eventos */
        itemsListening.add(pos);
    }

    public void setFadeInEffect(boolean status) {
        this.fadeInEffect = status;
    }

    public boolean getFadeInEffect() {
        return fadeInEffect;
    }

    private void resetFadeInEffect() {
        this.alphaEffect = 255;
    }

    public void paint(Graphics g) {  /* Invoca representacion de cada widget */
        Color color;
        background.paint(g);
        int opacity = (int) (((float) getBgOpacity() / 100 * 255));
        color = new Color(0, 0, 0, opacity);
        g.setColor(color);
        g.fillRect(0, 0, winWIDTH, winHEIGHT);

        for (int i = 0; i < items.size(); i++) {
            ((iWidget) items.get(i)).paint(g);
        }
        
        if (getFadeInEffect()) {
            color = new Color(0, 0, 0, alphaEffect);
            g.setColor(color);
            g.fillRect(0, 0, winWIDTH, winHEIGHT);
            if (alphaEffect > 0) {
                alphaEffect -= 20;
            }
            if (alphaEffect < 0) {
                alphaEffect = 0;
            }
        }
    }

    public void setNextEsc(String next) {
        this.nextEsc = next;
    }

    public String getNextEsc() { /*Calcula seguinte escenario */
        if (nextEsc.equals("")) { //Se non esta definido, aplicamos algoritmo
            String selectedItem =
                    ((iTextMenu) items.get(menuItem)).getActiveItemValue();
            String result;
            if (getId().equals("")) {
                result = selectedItem;
            } else {
                result = getId().concat("=").concat(selectedItem);
            }
            if (((iTextMenu) items.get(menuItem)).activeIsFolder()) {
                return result;
            }
            /*Devolveremos o identificador do escenario + o elemento
             *seleccionado do menu */
            if (!getId().equals("")) {
                /*Se o elemento seleccionado non e carpeta, e o id ten algun
                 *valor, significa que queremos reproducir o elto seleccionado*/
                return EscenariosDefinidos.PLAY.concat("=").
                        concat(getId()).concat("=").concat(selectedItem);
            } else {
                return EscenariosDefinidos.PRINCIPAL;
            }
        /*O elemento seleccionado non e carpeta e non hai identificador
         *=> algo falla => menu principal */
        }
        return this.nextEsc; /*hai un valor predefinido, que sobreescribe o
     *algoritmo */
    }

    public void setPrevEsc(String prev) {
        this.prevEsc = prev;
    }

    public String getPrevEsc() {
        if (prevEsc.equals("")) {
            /*O algoritmo devolve o escenario inmediatamente anterior */
            String result = getId().substring(0, getId().lastIndexOf("="));
            return result;
        }
        return this.prevEsc;
    }

    public void setMenuItem(int index) { //Indica que item e o menu
        this.menuItem = index;
    }

    private void nuevaSeleccion() {
         /* Se invoca cuando el usuario navega por las fotos del carrusel de
         * la reproduccion de fotos */
        String fotoSeleccionada;
        iPicture foto;

        /* Para o caso especial de ser o escenario de reproduccion de
                 fotos, interesa que ao mover o cursos se actualice a foto, 
                 por iso a cargamos en cada movemento */
        if (EscenariosDefinidos.escenarioReproducirFotos(getId())) {
                fotoSeleccionada = ((iTextMenu) items.get(menuItem)).
                        getActiveItemValue();
                foto = (iPicture) items.get(getMainPicture());
                foto.setImage(fotoSeleccionada);
                foto.refreshBuffer();
                foto.setAdjustedSize(
                        Escenario.getWidth(), Escenario.getHeight());
        }
    }
    
    private void arriba() {
        nuevaSeleccion();
        if (EscenariosDefinidos.escenarioReproducirMusicaLista(getId())
                || EscenariosDefinidos.escenarioReproducirMusica(getId())) {
            Principal.subirVolumen();
        }
    }
    
    private void abaixo() {
        nuevaSeleccion();
        if (EscenariosDefinidos.escenarioReproducirMusicaLista(getId())
                || EscenariosDefinidos.escenarioReproducirMusica(getId())) {
            Principal.bajarVolumen();
        }
    }
    
    private void space() {
        if (EscenariosDefinidos.escenarioReproducirMusicaLista(getId())
                || EscenariosDefinidos.escenarioReproducirMusica(getId())) {
            Principal.playPause();
        }
        else resetFadeInEffect();
    }
    
    public void keyPressed(KeyEvent e) { /*Transmitimos os eventos de teclado
         *aos items activos*/
        for (int i = 0; i < itemsListening.size(); i++) {
            ((iWidget) items.get(((Integer) 
                    itemsListening.get(i)).intValue())).keyPressed(e);
        }
        
        switch (e.getKeyCode()) {
            case KeyEvent.VK_UP: {
                arriba();
                break;
            }
            case KeyEvent.VK_DOWN: {
                abaixo();
                break;
            }
        }
    }
    
    public void keyReleased(KeyEvent e) { /*Transmitimos os eventos de teclado
         *aos items activos*/
        
        switch (e.getKeyCode()) {
            case KeyEvent.VK_SPACE: {
                space();
                break;
            }
            case KeyEvent.VK_ESCAPE: {
                resetFadeInEffect();
                break;
            }
        }
    }
}
